//密码类
/**
 * 正则：密码强度校验，必须同时包括大写字母，小写字母，数字,特殊字符
 *
 */
const AUTHKEY_CHECK='^(?![A-Za-z0-9]+$)(?![a-z0-9\\W]+$)(?![A-Za-z\\W]+$)(?![A-Z0-9\\W]+$)[a-zA-Z0-9\\W]{8,16}$'
 
//  const AUTHKEY_CHECK='^(?:(?=.*[^a-zA-Z0-9])(?=.*[a-zA-Z])(?=.*[0-9])).{8,16}$'

 /**
  * 正则 ：java类名
  *
  */
 const JAVA_CLASS_NAME = '^[a-zA-Z]+[0-9a-zA-Z_]*(\.[a-zA-Z]+[0-9a-zA-Z_]*)*$'
// 数字类
/**
 * 正则: 数字
 */
const REGEX_LIB_NUM = '^[0-9]*$'

/**
 * 正则: 正数、负数、或小数
 */
const REGEX_IOF_IGNORE_SYM = '^(\\-|\\+)?\\d+(\\.\\d+)?$'

/**
 * 正则: 非零正整数
 */
const REGEX_NOTZERO_INT_POS = '^\\+?[1-9][0-9]*$'

/**
 * 正则:非零负整数
 */
const REGEX_NOTZERO_INT_NEG = '^-[1-9]\\d*$'

/**
 * 正则:非负整数
 */
const REGEX_NONEGATIVE_INT = '^\\d+$'

/**
 * 正则:非正整数
 */
const REGEX_NOPOSITIVE_INT = '^((-\\d+)|(0+))$'

/**
 * 正则:非负浮点数
 */
const REGEX_NONEGATIVE_FLOAT = '^\\d+(\\.\\d+)?$'

/**
 * 正则:非正浮点数
 */
const REGEX_NOPOSITIVE_FLOAT = '^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$'

/**
 * 正则:负浮点数
 */
const REGEX_NEGATIVE_FLOAT = '^-([1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*)$'

/**
 * 正则:正浮点数
 */
const REGEX_POSITIVE_FLOAT = '^[1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*$'

/**
 * 正则:浮点数
 */
const REGEX_FLOAT = '^(-?\\d+)(\\.\\d+)?$'

// 字符类
/**
 * 正则: 汉字
 */
const REGEX_CHINESE_CHARACTERS = '^[\\u4e00-\\u9fa5]{0,}$'

/**
 * 正则 :英文字母和数字
 */
const REGEX_LETTERS_AND_NUMBERS = '^[A-Za-z0-9]+$'

/**
 * 正则: 英文字母
 */
const REGEX_LETTERS = '^[A-Za-z]+$'

/**
 * 正则: 大写字母
 */
const REGEX_LETTERS_CAPITAL = '^[A-Z]+$'

/**
 * 正则: 小写字母
 */
const REGEX_LETTERS_SMALL = '^[a-z]+$'

/**
 * 正则 :英文字母、数字、下划线
 */
const REGEX_LETTERS_NUMBERS_UNDERLINE = '^\\w+$'

/**
 * 正则 :英文字母、数字、下划线、中划线
 * @type {string}
 */
const REGEX_LETTERS_NUMBERS_UNDERLINE_MIDDLELINE = '^(\\w|[-])+$'
/**
 * 正则: 英文字母、数字、下划线、短横线、.：#&？/=等http协议相关的符号
 */

const REGEX_HTTP = '^[A-Za-z0-9_//&#?:=.-]*$'

/**
 * 正则: CRON表达式验证
 */

const REGEX_CRONEXP ='(((^([0-9]|[0-5][0-9])(\\,|\\-|\\/){1}([0-9]|[0-5][0-9]) )|^([0-9]|[0-5][0-9]) |^(\\* ))((([0-9]|[0-5][0-9])(\\,|\\-|\\/){1}([0-9]|[0-5][0-9]) )|([0-9]|[0-5][0-9]) |(\\* ))((([0-9]|[01][0-9]|2[0-3])(\\,|\\-|\\/){1}([0-9]|[01][0-9]|2[0-3]) )|([0-9]|[01][0-9]|2[0-3]) |(\\* ))((([0-9]|[0-2][0-9]|3[01])(\\,|\\-|\\/){1}([0-9]|[0-2][0-9]|3[01]) )|(([0-9]|[0-2][0-9]|3[01]) )|(\\? )|(\\* )|(([1-9]|[0-2][0-9]|3[01])L )|([1-7]W )|(LW )|([1-7]\\#[1-4] ))((([1-9]|0[1-9]|1[0-2])(\\,|\\-|\\/){1}([1-9]|0[1-9]|1[0-2]) )|([1-9]|0[1-9]|1[0-2]) |(\\* ))(([1-7](\\,|\\-|\\/){1}[1-7])|([1-7])|(\\?)|(\\*)|(([1-7]L)|([1-7]\\#[1-4]))))|(((^([0-9]|[0-5][0-9])(\\,|\\-|\\/){1}([0-9]|[0-5][0-9]) )|^([0-9]|[0-5][0-9]) |^(\\* ))((([0-9]|[0-5][0-9])(\\,|\\-|\\/){1}([0-9]|[0-5][0-9]) )|([0-9]|[0-5][0-9]) |(\\* ))((([0-9]|[01][0-9]|2[0-3])(\\,|\\-|\\/){1}([0-9]|[01][0-9]|2[0-3]) )|([0-9]|[01][0-9]|2[0-3]) |(\\* ))((([0-9]|[0-2][0-9]|3[01])(\\,|\\-|\\/){1}([0-9]|[0-2][0-9]|3[01]) )|(([0-9]|[0-2][0-9]|3[01]) )|(\\? )|(\\* )|(([1-9]|[0-2][0-9]|3[01])L )|([1-7]W )|(LW )|([1-7]\\#[1-4] ))((([1-9]|0[1-9]|1[0-2])(\\,|\\-|\\/){1}([1-9]|0[1-9]|1[0-2]) )|([1-9]|0[1-9]|1[0-2]) |(\\* ))(([1-7](\\,|\\-|\\/){1}[1-7] )|([1-7] )|(\\? )|(\\* )|(([1-7]L )|([1-7]\\#[1-4]) ))((19[789][0-9]|20[0-9][0-9])\\-(19[789][0-9]|20[0-9][0-9])))'

/**
 * 中文、英文、数字包括下划线
 */
const REGEX_CHN_ENG_NUM_AND_UNDERLINE = '^[\\u4E00-\\u9FA5A-Za-z0-9_]+$'

/**
 * 正则: 中文、英文、数字但不包括下划线等符号
 */
const REGEX_CHN_ENG_NUM_NO_UNDERLINE = '^[\\u4E00-\\u9FA5A-Za-z0-9]+$'

/**
 * 正则: Email电子邮箱
 */
const REGEX_EMAIL = '^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$'

/**
 * 正则: 手机号码
 */
const REGEX_MOBILE_PHONE = '^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$'

/**
 * 正则: 座机电话号码
 */
const REGEX_TEL = '^(\\d{3,4}-)?\\d{7,8}$'

/*
 * 正则: 邮政编码
 */
const REGEX_POST_CODE = '[1-9]\\d{5}(?!\\d)'
/*
 * 正则：URL域名
 */
const REGEX_URL = '([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?'

/*
 * 正则：中文姓名
 */
const REGEX_CN_NAME = '[\\u4E00-\\u9FA5]{2,5}(?:·[\\u4E00-\\u9FA5]{2,5})*'

/*
 * 正则：日期时间（YYYY-MM-DD hh:mm:ss 或 YYYY-MM-DD）
 */
const REGEX_DATE_TIME = '^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s((([0-1][0-9])|(2?[0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$'

/*
 * 正则：IP地址
 */
//const REGEX_IP = '(?=(\\b|\\D))(((\\d{1,2})|(1\\d{1,2})|(2[0-4]\\d)|(25[0-5]))\\.){3}((\\d{1,2})|(1\\d{1,2})|(2[0-4]\\d)|(25[0-5]))(?=(\\b|\\D))'
const REGEX_IP = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-4])$/;
/**
 * 正则：身份证号码（15位、18位）
 */
//const REGEX_IDCARD = '(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)'
const REGEX_IDCARD = /^((11|12|13|14|15|21|22|23|31|32|33|34|35|36|37|41|42|43|44|45|46|50|51|52|53|54|61|62|63|64|65|71|81|82|91)\d{4})((((19|20)(([02468][048])|([13579][26]))0229))|((20[0-9][0-9])|(19[0-9][0-9]))((((0[1-9])|(1[0-2]))((0[1-9])|(1\d)|(2[0-8])))|((((0[1,3-9])|(1[0-2]))(29|30))|(((0[13578])|(1[02]))31))))((\d{3}(x|X))|(\d{4}))$/; 

/**
 * 正则表达式获取：身份证号码（15位、18位）
 */
const _getIDCard = (o) => {
  return o ? REGEX_IDCARD : '身份证号码不正确，请重新输入'
}

//正则表达式获取：英文字母、数字、下划线、短横线、：#&？/=等http协议相关的符号
const _getHttp = (o) => {
  return o ? REGEX_HTTP : '格式不正确，请重新输入'
}
// 正则表达式获取: 密码强度校验
const _getAuthyKeyCheck = (o) => {
  return o ? AUTHKEY_CHECK : '密码过于简单'
}

const _getJavaClassName = (o) => {
  return o ? JAVA_CLASS_NAME : '类名不正确'
}
// 正则表达式获取: 数字
const _getNum = (o) => {
  return o ? REGEX_LIB_NUM : '请输入数字'
}

//正则表达式获取：URL域名
const _getUrl = (o) => {
  return o ? REGEX_URL : '请输入正确的url'
}

//正则表达式获取：中文姓名
const _getCNName = (o) => {
  return o ? REGEX_CN_NAME : '请输入正确的中文名'
}

//正则表达式获取：日期时间
const _getDateTime = (o) => {
  return o ? REGEX_DATE_TIME : '请输入正确的日期时间'
}

//正则表达式获取：IP地址
const _getIP = (o) => {
  return o ? REGEX_IP : '请输入正确的IP地址'
}

// 正则表达式获取: 正数、负数、或小数
const _getIOFIgnoreSym = (o) => {
  return o ? REGEX_IOF_IGNORE_SYM : '请输入正数、负数、或小数'
}

// 正则表达式获取: 非零正整数
const _getNotZeroIntPos = (o) => {
  return o ? REGEX_NOTZERO_INT_POS : '请输入非零正整数'
}
// 正则表达式获取: 非零负整数
const _getNotZeroIntNeg = (o) => {
  return o ? REGEX_NOTZERO_INT_NEG : '请输入非零负整数'
}

// 正则表达式获取: 非负整数
const _getNoNegativeInt = (o) => {
  return o ? REGEX_NONEGATIVE_INT : '请输入非负整数'
}

// 正则表达式cron表达式
const _getCronExp = (o) => {
  return o ? REGEX_CRONEXP : '请输入正确的cron表达式'
}

// 正则表达式获取: 非正整数
const _getNoPositiveInt = (o) => {
  return o ? REGEX_NOPOSITIVE_INT : '请输入非正整数'
}

// 正则表达式获取: 非负浮点数
const _getNoNegativeFloat = (o) => {
  return o ? REGEX_NONEGATIVE_FLOAT : '请输入数字'
}
// 正则表达式获取: 非正浮点数
const _getNoPositiveFloat = (o) => {
  return o ? REGEX_NOPOSITIVE_FLOAT : '请输入非正浮点数'
}

// 正则表达式获取: 负浮点数
const _getNegativeFloat = (o) => {
  return o ? REGEX_NEGATIVE_FLOAT : '请输入负浮点数'
}

// 正则表达式获取: 正浮点数
const _getPositiveFloat = (o) => {
  return o ? REGEX_POSITIVE_FLOAT : '请输入正浮点数'
}

// 正则表达式获取: 浮点数
const _getFloat = (o) => {
  return o ? REGEX_FLOAT : '请输入浮点数'
}

// 正则表达式获取: 汉字
const _getChineseCharacters = (o) => {
  return o ? REGEX_CHINESE_CHARACTERS : '请输入汉字'
}

// 正则表达式获取: 英文字母和数字
const _getLettersAndNumbers = (o) => {
  return o ? REGEX_LETTERS_AND_NUMBERS : '请输入英文字母和数字'
}

// 正则表达式获取: 英文字母
const _getLetters = (o) => {
  return o ? REGEX_LETTERS : '请输入英文字母'
}

// 正则表达式获取: 大写字母
const _getLettersCapital = (o) => {
  return o ? REGEX_LETTERS_CAPITAL : '请输入字母'
}

// 正则表达式获取: 小写字母
const _getLettersSmall = (o) => {
  return o ? REGEX_LETTERS_SMALL : '请输入小写字母'
}

// 正则表达式获取: 英文字母、数字、下划线
const _getLettersNumbersUnderline = (o) => {
  return o ? REGEX_LETTERS_NUMBERS_UNDERLINE : '请输入英文字母、数字、下划线'
}

const _getLettersNumbersUnderlineMiddleline = (o) => {
  return o ? REGEX_LETTERS_NUMBERS_UNDERLINE_MIDDLELINE : '请输入英文字母、数字、下划线、中划线'
}

// 正则表达式获取: 中文、英文、数字包括下划线
const _getChnEngNumAndUnderline = (o) => {
  return o ? REGEX_CHN_ENG_NUM_AND_UNDERLINE : '请输入中文、英文、数字包括下划线'
}

// 正则表达式获取: 中文、英文、数字但不包括下划线等符号
const _getChnEngNumNoUnderline = (o) => {
  return o ? REGEX_CHN_ENG_NUM_NO_UNDERLINE : '请输入中文、英文、数字但不包括下划线等符号'
}

// 正则表达式获取: Email电子邮箱
const _getEmail = (o) => {
  return o ? REGEX_EMAIL : '请输入正确的Email电子邮箱'
}

// 正则表达式获取: 手机号码
const _getMobilePhone = (o) => {
  return o ? REGEX_MOBILE_PHONE : '请输入正确的手机号码'
}

// 正则表达式获取: 座机电话号码
const _getTel = (o) => {
  return o ? REGEX_TEL : '请输入正确的座机电话号码'
}

// 正则表达式获取: 邮政编码
const _getPostCode = (o) => {
  return o ? REGEX_POST_CODE : '请输入正确的邮政编码'
}

// 获取n位数的正则表达式
const _getNBitNum = (o, n) => {
  return o ? '^\\d{' + n + '}$' : '请输入' + n + '位数字'
}

// 获取至少n位数的正则表达式
const _getLeastNBitNum = (o, n) => {
  return o ? '^\\d{' + n + ',}$' : '请输入至少' + n + '位数字'
}

// 获取m-n位数的正则表达式
const _getRangeBitNum = (o, m, n) => {
  return o ? '^\\d{' + m + ',' + n + '}$' : '请输入' + m + '-' + n + '位数字'
}
// 获取指定整数部分与小数部分位数的正则表达式
const _limitBit = (o, m, n) => {
  return o ? '^\\d{1,' + m + '}(\\.\\d{1,' + n + '})?$' : '最多输入' + m + '位整数和' + n + '小数'
}
const _length = (o, l) => {
  return o ? '^([\\s\\S*]){1,' + l + '}$' : '最大长度为' + l
}
// 数字,字母,汉字,全\半角括弧
const _esopName = (o) => {
  return o ? '^[\\u4E00-\\u9FA5A-Za-z0-9()（）]+$' : '不能含有特殊字符'
}
const _returnStr = (val) => {
  if (val === undefined || val === null) {
    return ''
  } else {
    return val + ''
  }
}

export default {
  returnStr (val) {
    return _returnStr(val)
  },
  length (o, l) {
    return _length(o, l)
  },
  authyKey (o) {
    return _getAuthyKeyCheck(o)
  },
  className (o) {
    return _getJavaClassName(o)
  },

  num (o) {
    return _getNum(o)
  },
  iofIgnoreSym (o) {
    return _getIOFIgnoreSym(o)
  },
  notZeroIntPos (o) {
    return _getNotZeroIntPos(o)
  },
  notZeroIntNeg (o) {
    return _getNotZeroIntNeg(o)
  },
  noNegativeInt (o) {
    return _getNoNegativeInt(o)
  },
  noPositiveInt (o) {
    return _getNoPositiveInt(o)
  },
  noNegativeFloat (o) {
    return _getNoNegativeFloat(o)
  },
  NoPositiveFloat (o) {
    return _getNoPositiveFloat(o)
  },
  negativeFloat (o) {
    return _getNegativeFloat(o)
  },
  positiveFloat (o) {
    return _getPositiveFloat(o)
  },
  float (o) {
    return _getFloat(o)
  },
  chineseCharacters (o) {
    return _getChineseCharacters(o)
  },
  lettersAndNumbers (o) {
    return _getLettersAndNumbers(o)
  },
  letters (o) {
    return _getLetters(o)
  },
  lettersCapital (o) {
    return _getLettersCapital(o)
  },
  lettersSmall (o) {
    return _getLettersSmall(o)
  },
  lettersNumbersUnderline (o) {
    return _getLettersNumbersUnderline(o)
  },
  chnEngNumAndUnderline (o) {
    return _getChnEngNumAndUnderline(o)
  },
  chnEngNumNoUnderline (o) {
    return _getChnEngNumNoUnderline(o)
  },
  email (o) {
    return _getEmail(o)
  },
  tel (o) {
    return _getTel(o)
  },
  postCode (o) {
    return _getPostCode(o)
  },
  mobilePhone (o) {
    return _getMobilePhone(o)
  },
  nBitNum (o, n) {
    return _getNBitNum(o, n)
  },
  leastNBitNum (o, n) {
    return _getLeastNBitNum(o, n)
  },
  rangeBitNum (o, m, n) {
    return _getRangeBitNum(o, m, n)
  },
  // 客户管理模块
  // 容量类型正则
  getCapacity (o) {
    return _getNoNegativeFloat(o)
  },
  // 容量类型正则
  limitBit (o, m, n) {
    return _limitBit(o, m, n)
  },
  // 名称类型正则
  esopName (o) {
    return _esopName(o)
  },
  // URL正则
  getUrl (o) {
    return _getUrl(o)
  },
  //中文姓名正则
  getCNName (o) {
    return _getCNName(o)
  },
  //日期时间正则
  getDateTime (o) {
    return _getDateTime(o)
  },
  //IP地址正则
  getIP (o) {
    return _getIP(o)
  },
  //HTTP正则
  getHttp (o) {
    return _getHttp (o)
  },
  //cron正则
  getCronExp (o) {
    return _getCronExp (o)
  },
  //身份证号码正则
  getIDCard (o) {
    return _getIDCard(o)
  },
  getLettersNumbersUnderlineMiddleline (o) {
    return _getLettersNumbersUnderlineMiddleline(o)
  }
}
